var _ = require("lodash");
// _.cloneWith(value, [customizer])
// 这个函数的作用是根据自定义的规则堆对象进行深度的克隆
// 第二个参数是一个自定义函数，用于控制被复制的过程，这个函数会在每次复制期间
// 被调用，他接受三个参数：被复制的值、被复制的键、以及被复制的对象
//  如果 customizer 返回 undefined 将会使用拷贝方法代替处理

// 定义一个包含函数的对象
const originalObject = [
  {
    name: "Alice",
    cloneMethod: (value) => `Cloned: ${value}`, // 自定义克隆逻辑
  },
  {
    name: "Bob",
    cloneMethod: null, // 使用默认克隆逻辑
  },
];

// 自定义复制函数，只复制字符串类型的属性值
function customizer(value) {
  if (_.isFunction(value.cloneMethod)) {
    // 如果对象有自定义的克隆方法，则使用它
    return value.cloneMethod(value.name);
  }
  // 否则，使用默认的克隆逻辑
  return _.cloneDeep(value);
}

// 使用自定义复制函数进行复制
// 这个方法不好用，没有实现效果
const clonedObject = _.cloneWith(originalObject, customizer);

console.log(clonedObject);
